const mysql = require('mysql2');

const dbConfig = {
	host: process.env.NODE_ENV_DB_HOST,
	port: process.env.NODE_ENV_DB_PORT_MYSQL,
	user: process.env.NODE_ENV_DB_USER,
	password: process.env.NODE_ENV_DB_PASSWORD,
	database: process.env.NODE_ENV_DB_DATABASE,
};

// 创建连接池
const pool = mysql
	.createPool({
		// 连接池数量
		connectionLimit: 1,
		...dbConfig,
	})
	.promise();

/**
 * 处理响应数据
 * @param {String} sql - SQL语句
 * @param {any[]} payload - 负载参数
 * @returns {Promise<{data: any, fields: string[], message: string, error: boolean}>} result - 数据对象
 *   - data: 响应数据
 *   - fields: 数据表字段名数组
 *   - message: 响应消息
 *   - error: 是否报错
 */
async function query(sql, payload = []) {
	let result = {
		data: null,
		fields: null,
		message: '',
		error: false,
	};

	try {
		// 执行SQL语句
		const res = await pool.query(sql, payload);
		result.data = res[0];
		result.fields = res[1];
	} catch (err) {
		switch (err.errno) {
			case 1054:
				result.error = true;
				result.message = '接口参数异常';
				break;
			case -4078:
				throw new Error('数据库连接失败');
		}
	}

	return result;
}

// TODO 完善
async function execute(sql, payload) {
	// let result = {
	//   data: null,
	//   fields: null,
	//   message: null,
	// };

	// 执行SQL语句。支持预处理、支持防SQL注入
	const res = await pool.execute(sql, payload);

	return {
		data: res[0],
		fields: res[1],
	};
}

module.exports = {
	query,
	execute,
};
